package com.dkd.system.utils;

import com.dkd.system.domain.TWarranty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ReplaceBook {

    public static void main(String[] args) throws IOException {
        String jsonPath ="C:\\Users\\19747\\Desktop\\template_145_1756775772428.json";
        String outputPath = "C:\\Users\\19747\\Desktop\\modified_template.json";

        String json = Files.readString(Paths.get(jsonPath), StandardCharsets.UTF_8);
        TWarranty tWarranty = new TWarranty();
        tWarranty.setCustomer("江苏德生新材料锻造有限公司");
        tWarranty.setSteelGrade("316");
        tWarranty.setCertificateNo("20250902-02");
        tWarranty.setContractNo("250808-5");
        tWarranty.setFurnaceNo("2509A-V04");
        tWarranty.setProductCategory("钢锭");
//        TWarranty tWarranty1 = new TWarranty();
//        tWarranty1.setCustomer("中兴能源装备有限公司111");
//        tWarranty1.setSteelGrade("20#111");
//        tWarranty1.setCertificateNo("250812-2311111");
//        tWarranty1.setContractNo("20250902-01111111");
//        tWarranty1.setFurnaceNo("2509F-01YF11111");

        TWarranty tWarranty2 = new TWarranty();
        tWarranty2.setCustomer("江苏德生新材料锻造有限公司1");
        tWarranty2.setSteelGrade("123");
        tWarranty2.setCertificateNo("20250902-03");
        tWarranty2.setContractNo("250821-1");
        tWarranty2.setFurnaceNo("2509A-V05");

        Map<String, String> replacements = replacements(tWarranty,tWarranty2);
        String JSON = replaceByJsonPath(json, replacements);
//        String JSON = replaceWarrantyProperties(json, tWarranty,tWarranty2);
        //重新写入到桌面一个文件
        Files.writeString(Paths.get(outputPath), JSON, StandardCharsets.UTF_8);
        System.out.println("JSON文件修改完成，已保存到: " + outputPath);


    }


    /**
     * 将JSON中的旧对象属性值替换为新对象属性值
     * @param jsonData JSON数据字符串
     * @param oldWarranty 旧对象（源数据）
     * @param newWarranty 新对象（目标数据）
     * @return 替换后的JSON字符串
     */
    private static String replaceWarrantyProperties(String jsonData, TWarranty oldWarranty, TWarranty newWarranty) throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();
        JsonNode rootNode = mapper.readTree(jsonData);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");

        // 获取旧对象的格式化值
        String oldReportDate = oldWarranty.getReportDate() != null
                ? sdf.format(oldWarranty.getReportDate())
                : "";

        // 获取新对象的格式化值
        String newReportDate = newWarranty.getReportDate() != null
                ? sdf.format(newWarranty.getReportDate())
                : "";

        // 使用Map定义所有需要替换的映射（旧值 -> 新值）
        Map<String, String> replacements = new HashMap<>();

        // 客户名称
        if (oldWarranty.getCustomer() != null && newWarranty.getCustomer() != null) {
            replacements.put(oldWarranty.getCustomer(), newWarranty.getCustomer());
        }

        // 合同号
        if (oldWarranty.getContractNo() != null && newWarranty.getContractNo() != null) {
            replacements.put(oldWarranty.getContractNo(), newWarranty.getContractNo());
        }

        // 材料名称
        if (oldWarranty.getSteelGrade() != null && newWarranty.getSteelGrade() != null) {
            replacements.put(oldWarranty.getSteelGrade(), newWarranty.getSteelGrade());
        }

        // 产品类别
        if (oldWarranty.getProductCategory() != null && newWarranty.getProductCategory() != null) {
            replacements.put(oldWarranty.getProductCategory(), newWarranty.getProductCategory());
        }

        // 报告日期
        if (!oldReportDate.isEmpty() && !newReportDate.isEmpty()) {
            replacements.put(oldReportDate, newReportDate);
        }

        // 证书编码
        if (oldWarranty.getCertificateNo() != null && newWarranty.getCertificateNo() != null) {
            replacements.put(oldWarranty.getCertificateNo(), newWarranty.getCertificateNo());
        }


        // 遍历并替换所有旧值为新值
        for (Map.Entry<String, String> entry : replacements.entrySet()) {
            if (!entry.getKey().isEmpty() && !entry.getValue().isEmpty()) {
                jsonData = jsonData.replace(entry.getKey(), entry.getValue());
            }
        }

        return jsonData;
    }


    /**
     * 将JSON中的旧对象属性值替换为新对象属性值（安全替换）
     * @param oldWarranty 旧对象（源数据）
     * @param newWarranty 新对象（目标数据）
     * @return 替换后的JSON字符串
     */
    public static Map<String, String> replacements(TWarranty oldWarranty, TWarranty newWarranty) throws JsonProcessingException {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");

        // 获取旧对象的格式化值
        String oldReportDate = oldWarranty.getReportDate() != null
                ? sdf.format(oldWarranty.getReportDate())
                : "";

        // 获取新对象的格式化值
        String newReportDate = newWarranty.getReportDate() != null
                ? sdf.format(newWarranty.getReportDate())
                : "";

        // 使用Map定义所有需要替换的映射（旧值 -> 新值）
        Map<String, String> replacements = new HashMap<>();

        // 客户名称
        if (oldWarranty.getCustomer() != null && newWarranty.getCustomer() != null) {
            replacements.put(oldWarranty.getCustomer(), newWarranty.getCustomer());
        }

        // 合同号
        if (oldWarranty.getContractNo() != null && newWarranty.getContractNo() != null) {
            replacements.put(oldWarranty.getContractNo(), newWarranty.getContractNo());
        }

        // 材料名称
        if (oldWarranty.getSteelGrade() != null && newWarranty.getSteelGrade() != null) {
            replacements.put(oldWarranty.getSteelGrade(), newWarranty.getSteelGrade());
        }

        // 产品类别
        if (oldWarranty.getProductCategory() != null && newWarranty.getProductCategory() != null) {
            replacements.put(oldWarranty.getProductCategory(), newWarranty.getProductCategory());
        }

        // 数量
        if (oldWarranty.getQuantity() != null && newWarranty.getQuantity() != null) {
            replacements.put(oldWarranty.getQuantity(), newWarranty.getQuantity());
        }

        // 报告日期
        if (!oldReportDate.isEmpty() && !newReportDate.isEmpty()) {
            replacements.put(oldReportDate, newReportDate);
        }

        // 证书编码
        if (oldWarranty.getCertificateNo() != null && newWarranty.getCertificateNo() != null) {
            replacements.put(oldWarranty.getCertificateNo(), newWarranty.getCertificateNo());
        }
        // 炉号
        if (oldWarranty.getFurnaceNo() != null && newWarranty.getFurnaceNo() != null) {
            replacements.put(oldWarranty.getFurnaceNo(), newWarranty.getFurnaceNo());
        }
        return replacements;
    }

    /**
     * 安全替换JSON中的值（只在冒号或双引号后的位置替换）
     */
    private static String safeJsonReplace(String jsonData, String oldValue, String newValue) {
        // 转义特殊字符，用于正则表达式
        String escapedOldValue = Pattern.quote(oldValue);

        // 构建正则表达式，匹配JSON值位置（冒号后的双引号包围的值）
        String regex = "(:\\s*\")([^\"]*" + escapedOldValue + "[^\"]*)(\")";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(jsonData);

        StringBuffer result = new StringBuffer();
        while (matcher.find()) {
            // 获取整个匹配的值部分
            String fullValue = matcher.group(2);
            // 只替换匹配的部分
            String replacedValue = fullValue.replace(oldValue, newValue);
            // 重新构建匹配项
            String replacement = matcher.group(1) + replacedValue + matcher.group(3);
            matcher.appendReplacement(result, replacement);
        }
        matcher.appendTail(result);

        return result.toString();
    }



    /**
     * 基于JSON路径的精确替换（推荐使用）
     */
    public static String replaceByJsonPath(String jsonData, Map<String, String> replacements) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode rootNode = mapper.readTree(jsonData);

            // 递归处理所有节点
            processJsonNode(rootNode, replacements);

            return mapper.writeValueAsString(rootNode);
        } catch (Exception e) {
            e.printStackTrace();
            return jsonData;
        }
    }

    /**
     * 递归处理JSON节点进行精确替换
     */
    private static void processJsonNode(JsonNode node, Map<String, String> replacements) {
        if (node.isObject()) {
            ObjectNode objectNode = (ObjectNode) node;
            objectNode.fields().forEachRemaining(entry -> {
                JsonNode valueNode = entry.getValue();
                if (valueNode.isTextual()) {
                    String currentValue = valueNode.asText();
                    // 检查是否需要替换
                    for (Map.Entry<String, String> replacement : replacements.entrySet()) {
                        if (currentValue.equals(replacement.getKey())) {
                            objectNode.put(entry.getKey(), replacement.getValue());
                            break;
                        }
                    }
                }
                // 递归处理子节点
                processJsonNode(valueNode, replacements);
            });
        } else if (node.isArray()) {
            ArrayNode arrayNode = (ArrayNode) node;
            for (int i = 0; i < arrayNode.size(); i++) {
                processJsonNode(arrayNode.get(i), replacements);
            }
        }
    }
}
